package ar.edu.frba.utn.dds.Test;

import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import ar.edu.frba.utn.dds.Companias.AerolineaLanchita;
import ar.edu.frba.utn.dds.Expcetion.ConversionException;
import ar.edu.frba.utn.dds.Perfiles.Moroso;
import ar.edu.frba.utn.dds.Perfiles.Solvente;
import ar.edu.frba.utn.dds.Perfiles.VIP;
import ar.edu.frba.utn.dds.Usuario.Usuario;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.Companias;


public class Testing2Entrega {
	public Companias companias;
	public AerolineaLanchita lanchita;
	
	@Before
	public void setUp(){
		lanchita= new AerolineaLanchita();
		
		
		
		lanchita.asientos = new String[][] {
				//codigoAsiento-precioAsiento-claseAsiento-ubicacionAsiento-estadoAsiento-origen-destino-fechaSalida-fechaLlegada-horaSalida-horaLlegada
					{ "01202022220202-3", "9000", "P", "V", "D", "Buenos Aires","Barcelona","","","",""}, //deja de ser superOferta
					{ "01202022220123-3", "205.10", "E", "P", "D", "Porto Alegre","Moscu","2012-06-06","2012-06-08","18:00:00","20:00:00"}, //asiento ya comprado
					{ "01202012315523-8", "154.08", "E", "P", "D", "","","","","",""},
					{ "01202022267867-7", "255.98", "E", "P", "D", "","","","","",""},
					{ "01202022227897-3", "236.10", "P", "C", "D", "","","","","",""},
					{ "01202022998988-6", "148.23", "P", "V", "D", "","","","","",""},
					{ "01202022220008-3", "383.22", "T", "V", "D", "","","","","",""},
					{ "01202022256565-3", "282.19", "T", "C", "D", "","","","","",""},
					{ "01202022323423-5", "431.28", "T", "C", "D", "","","","","",""},
					{ "01202022220298-2", "528.81", "P", "V", "D", "","","","","",""} 
				};
		companias=new Companias();
		companias.agregarCompanias(lanchita);
			
	}
	
	/////////////////test del usuario
	@Test
	public void buscarAsientosParaElVip() throws ConversionException{
		
		Usuario usuario= new Usuario(null,null,null);
		usuario.setPerfil(new VIP());
		usuario.obtenerPosiblesViajes(null,null,null,null,null,null,companias.getCompanias());
		List<Asiento> asientos=usuario.getAsientosBusqueda();
		Assert.assertEquals(10, asientos.size());
	}
	@Test
	public void buscarAsientosParaElEstandar() throws ConversionException{
		Usuario usuarioEstandar= new Usuario(null,null,null);
		usuarioEstandar.setPerfil(new Solvente());
		usuarioEstandar.obtenerPosiblesViajes(null,null,null,null,null,null,companias.getCompanias());
		List<Asiento> asientosDelEstandar=usuarioEstandar.getAsientosBusqueda();
		Assert.assertEquals(4, asientosDelEstandar.size());
	}
	@Test
	public void buscarAsientosParaElQueNoGarpa() throws ConversionException{
		Usuario usuarioQueNoGarpa= new Usuario(null,null,null);
		usuarioQueNoGarpa.setPerfil(new Moroso());
		usuarioQueNoGarpa.obtenerPosiblesViajes(null,null,null,null,null,null,companias.getCompanias());
		List<Asiento> asientosDelQueNoGarpa=usuarioQueNoGarpa.getAsientosBusqueda();
		
		Assert.assertEquals(4, asientosDelQueNoGarpa.size());
		
	}
	
	@Test 
	public void verificarQueLaBusquedaQuedoGuardadaEnElHistorial() throws ConversionException{
		Usuario usuarioEstandar = new Usuario(null,null,null);
		usuarioEstandar.setPerfil(new Solvente());
		int historialVacio = usuarioEstandar.getBusquedas().size();
		usuarioEstandar.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		Assert.assertEquals(historialVacio+1, usuarioEstandar.getBusquedas().size());
	}
	
	@Test
	public void verifircarQueUnUsuarioPuedeComprar() throws ConversionException{
		Usuario usuarioVip=new Usuario(null,null,null);
		usuarioVip.setPerfil(new VIP());
		usuarioVip.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		usuarioVip.comprarAsiento(0);
		List<Asiento> asientos=usuarioVip.getAsientosBusqueda();
		Asiento asiento=asientos.get(0);
		Assert.assertEquals("C", asiento.getCompania().asientos[asiento.getCodigoIndice()][4]);
		
	}
	
	@Test (expected= ar.edu.frba.utn.dds.Excepciones.EstadoErroneoException.class)
	public void verificarQueNoSePuedeComprarUnAsientoYaComprado() throws ConversionException{
		Usuario usuarioVip=new Usuario(null,null,null);
		usuarioVip.setPerfil(new VIP());
		usuarioVip.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		
		Usuario otroUsuarioVip= new Usuario(null,null,null);
		otroUsuarioVip.setPerfil(new VIP());
		otroUsuarioVip.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		
		usuarioVip.comprarAsiento(1);
		
		otroUsuarioVip.comprarAsiento(1);
		Assert.assertEquals(0, otroUsuarioVip.getMontoCompras());
	}
	
	@Test
	public void verificarQueAumentoElMontoDeUnUsuarioAlComprar() throws ConversionException{
		Usuario usuarioVip=new Usuario(null,null,null);
		usuarioVip.setPerfil(new VIP());
		usuarioVip.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		Double montoAlInicio=usuarioVip.getMontoCompras();
		usuarioVip.comprarAsiento(0);
		List<Asiento> asientos=usuarioVip.getAsientosBusqueda();
		Asiento asiento=asientos.get(0);
		Assert.assertEquals(montoAlInicio+Double.parseDouble(asiento.getPrecioTotal()),Double.parseDouble(asiento.getPrecioTotal()));
	}
	
	/////////////test de los asientos
	
	@Test
	public void precioDeLosAsientosParaLosQuePagan(){
		Usuario usuarioEstandar=new Usuario(null,null,null);
		usuarioEstandar.setPerfil(new Solvente());
		String precioAsiento="800";
		Asiento asiento=new Asiento("codigo", precioAsiento, null, null, null, null, null, null,null,null,null,null, lanchita, usuarioEstandar);
		String precioConTodosLosImpuestos=String.valueOf(
				Double.valueOf(precioAsiento)*1.15+ usuarioEstandar.montoRecargo());
		Assert.assertEquals(asiento.getPrecioTotal(), precioConTodosLosImpuestos);
	}
	
	@Test
	public void precioDeLosAsientosParaLosQueNoPagan(){
		Usuario usuarioQueNoGarpa=new Usuario(null,null,null);
		usuarioQueNoGarpa.setPerfil(new Moroso());
		String precioAsiento="800";
		Asiento asiento=new Asiento("codigo", precioAsiento, null, null, null, null, null, null,null,null,null,null, lanchita, usuarioQueNoGarpa);
		String precioConTodosLosImpuestos=String.valueOf(
				Double.valueOf(precioAsiento)*1.15+ usuarioQueNoGarpa.montoRecargo());
		Assert.assertEquals(asiento.getPrecioTotal(), precioConTodosLosImpuestos);
	}
	
	@Test(expected = ar.edu.frba.utn.dds.Excepciones.CodigoErroneoException.class)
	public void verificarCodigoDeAsientoInvalido() throws ConversionException{
		Usuario usuarioQueNoGarpa=new Usuario(null,null,null);
		usuarioQueNoGarpa.setPerfil(new Moroso());
		usuarioQueNoGarpa.obtenerPosiblesViajes(null,null,null,null,null,null, companias.getCompanias());
		usuarioQueNoGarpa.comprarAsiento(0);
		List<Asiento> asientos=usuarioQueNoGarpa.getAsientosBusqueda();
		asientos.get(0).setCodigoAsiento("        ");
		usuarioQueNoGarpa.comprarAsiento(0);
	}
	
	@Test
	public void esSuperOfertaElDePrimeraClaseYPrecio5Lucas(){
		Usuario vip=new Usuario(null,null,null);
		vip.setPerfil(new VIP());
		Asiento asiento= new Asiento("codigo","5000","P","C","D",null,null,null,null,null,null,0,lanchita,vip);
		Assert.assertEquals(true, asiento.sosSuperOferta());
	}
	@Test
	public void esSuperOfertaElDeClaseEjecutivaYPrecio3Lucas(){
		Usuario vip=new Usuario(null,null,null);
		vip.setPerfil(new VIP());
		Asiento asiento= new Asiento("codigo","3000","E","C","D",null,null,null,null,null,null,0,lanchita,vip);
		Assert.assertEquals(true, asiento.sosSuperOferta());
	}
	
	@Test
	public void vueloABarcelona() throws ConversionException{
		Usuario user = new Usuario(null,null,null);
		user.setPerfil(new VIP());
		user.obtenerPosiblesViajes("Porto Alegre",null,null,null,null,null,companias.getCompanias());
		Assert.assertEquals(1, user.getAsientosBusqueda().size());
	}
	
	public void vueloConTodosLosDatos() throws ConversionException{
		Usuario user = new Usuario(null,null,null);
		user.setPerfil(new VIP());
		user.obtenerPosiblesViajes("Porto Alegre","Moscu","2012-06-06","18:00:00","2012-06-08","20:00:00",companias.getCompanias());
		Assert.assertEquals(1, user.getAsientosBusqueda().size());
	}
	
	public void vueloConDistintoFormatoDeFecha() throws ConversionException{
		Usuario user = new Usuario(null,null,null);
		user.setPerfil(new VIP());
		user.obtenerPosiblesViajes("Porto Alegre","Moscu","06-06-2012",null,"08/06/2012",null,companias.getCompanias());
		Assert.assertEquals(1, user.getAsientosBusqueda().size());
	}
}
